A virtual machine (VM) is a method of abstracting or emulating real computing resources such as memory, CPU cycles, and network interfaces. This abstraction allows multiple virtual machines to co-exist on one physical server, each sharing the resources available. Importantly, software running in a VM generally does not have any awareness of the other VMs. The VM host provides a complete OS environment to each VM client.
Virtual machines have become very popular in IT departments. They allow the commissioning and de-commissioning of servers as needed without the purchase or disposal of hardware. VMs also allow resources to be utilized more efficiently. A server hosted in a VM that is idle for most of the time does not require a dedicated CPU or memory that is hardly used. VMs also make deployment predictable because individual virtual servers do not interact, which is not the case if servers share a common OS installation. So if a patch is required for an email server, the email server can be taken offline without affecting a web server that may, for cost reasons, share the same server hardware.
Historically, gaming machine software has either been monolithic or thick-client. In a monolithic implementation a gaming machine contains a dedicated CPU, memory and associated peripherals. The gaming machine software may implement multi-game, or have the capability to receive system updates of new games but at any one time only one software instance runs on a dedicated CPU. A thick-client implementation has the same characteristics except that certain functions such as random number generation are handled by a server common to many machines.
While the use of virtual machines does provide many benefits, virtual machines are also associated with several disadvantages. The significant disadvantage of VMs is the extra overhead they require to operate. Some of this overhead is CPU usage. For example, if two VMs share one physical CPU then there is a cost in switching contexts between the two. With modern VM-aware CPUs this overhead is relatively small and acceptable. However, another disadvantage is the bigger overhead associated with the memory footprint requirements of VMs. As noted above, each VM instance has its own OS installation and does not share resources with other co-hosted instances.
Continuing, current systems that render graphics generally use a central processing unit (CPU) having a corresponding system memory, and a graphics processing unit (GPU) having a corresponding video memory. The CPU sends instructions to the GPU to draw visual elements for rendering into a frame buffer in the video memory. The instructions typically comprise commands to draw graphical primitives such as shapes, polygons, textures, coordinates, and other metadata. Graphical primitives that are frequently used or of a particular size are often cached in the video memory to avoid saturating the data bus between the CPU and GPU. Even though the video memory generally reserves a region for one or more frame buffers, most of the memory is usually reserved for and consumed by textures. Textures are generally used to add detail to an underlying graphical primitive such as a line, polygon, or surface by using a process known as texture mapping. Otherwise stated, textures give the illusion of geometric complexity.
Textures vary from application to application. For example, in a casino gaming environment, a texture may include a reel symbol, button icon, or logo on an electronic gaming machine (EGM) that presents a slot machine style game. In an application involving an EGM that presents a Blackjack game, a different texture may correspond to the chip icons and the individual rank and suit of each playing card. For example, a rectangle may be mapped with an Ace of Spades texture or a King of Hearts texture. Another example highlights the importance of texture mapping. A game may depict a brick wall. Without texture mapping, the brick wall may be presented by a multitude of offset and adjacent rectangles. However, the geometric complexity may be reduced by mapping a texture, such as a bitmap derived from an image, or even an animation, of a brick wall, over a single large rectangle.
Textures may generally be categorized as static or dynamic. Static textures are derived from graphical data such as images or animations whereas dynamic textures are derived from graphical data such as a streamed animation, i.e., an animation that is accessed as a stream (frame by frame). The graphical data corresponding to both static and dynamic textures may be stored in system memory in a lossy or lossless compressed state. During a pre-load boot process, the CPU or GPU usually decompresses the compressed graphical data corresponding to static textures and stores the uncompressed textures in the video memory associated with the GPU. For example, a compressed image (i.e., non-animated graphic) may be decompressed and stored as a single texture in video memory. Similarly, each frame corresponding to an animation may be decompressed and stored as an individual texture in video memory. With respect to dynamic textures, the CPU or GPU usually decompresses the compressed graphical data as each frame is needed for rendering rather than pre-load the video memory with all frames during the pre-load boot process as is done for static textures. For example, the first frame of a streamed animation may be decompressed, stored in video memory, rendered, and then discarded prior to decompression of the next frame in the streamed animation.
The use of textures has resulted in video memory being fully utilized (or very close to being fully utilized) by designers. Accordingly, though the storage of textures on the video memory reduces the amount of data transferred from the CPU to the GPU, such memory consumption affects the number of games or instances of software that may be run in a virtualized environment. Thus, the advent of virtualization has generated a need to reduce the consumption of memory associated with the GPU. More specifically, virtualization enables multiple games or other software to be run on a single server employing a CPU and GPU provided that there are enough system resources (e.g., video memory) for each game or software instance. Thus, there is a need to provide more memory considering a single game is often designed to fully utilize video memory. One solution comprises introducing more hardware; however, this adds cost and may only be possible with custom hardware depending on the amount of memory sought to be added. Accordingly, there continues to be a need for improvements in the area of virtualization; and more particularly, the memory associated with a virtualized environment.